# 使用数据库获取token
# 使用 pymysql 的 库进行查询

import hashlib

import pymysql
from flask import Flask, request, jsonify
# 可能的正确导入方式
from dbutils.pooled_db import PooledDB


app = Flask(__name__)

POOL = PooledDB(
    creator=pymysql, # 使用连接数据库的模块
    maxconnections=10, # 连接池允许的最大连接数, 0 和 None 表示不限制
    mincached=2, # 初始化时连接池中至少创建的空闲连接 0 表示不创建
    maxcached=3, # 最多闲置的连接 0 和 None表示不限制
    blocking=True, # 连接池中如果没有可用连接后 是否阻塞等等 True=等待 False 不等待然后报错
    setsession=[], # 开始会话前执行的命令列表 如 【"set datestyle to....", "set time zone"】
    ping=0,
    # **settings.MYSQL_CONN_PARAMS
    host="127.0.0.1", port=3306, user="root", password="root", charset="utf8", db="flask-demo"
)

# 操作数据库取数据.
def fetch_one(sql, param):
    conn = POOL.connection()
    cursor = conn.cursor()

    cursor.execute(sql, param)
    result = cursor.fetchone()
    cursor.close()
    conn.close() # 不是关闭连接，将此连接交还给连接池
    print(f"result is : {result}")
    return result

@app.route("/")
def home():
    print("OK")
    return "OK"


@app.route("/bili", methods=["POST"])
def bili_sign():
    """
    请求的URL中需要携带 token:
    request data form {"ordered_string"}
    """
    # token 是否为空
    token = request.args.get("token")
    if not token:
        return jsonify({"status":False, "data":"认证失败","version": "v5"})


    # user_dict = get_user_dict()
    # print(f"user_dict: {user_dict}")

    # if token not in user_dict.keys():
    # if token not in user_dict:
    #     return jsonify({"status": False, "data": "认证失败"})

    """
    key in d 其实和 key in d.keys()是一样的效果, 不过建议优先使用前者, 因为它的效率更高
    """
    # token is valid?

    result = fetch_one("select * from user where token=%s", [token, ])
    if not result:
        return jsonify({"status":False, "data":"认证失败","version": "v5"})

    try:
        ordered_string = request.json.get("ordered_string")
        if not ordered_string:
            return jsonify({"status":False,"data":"参数错误","version": "v5"})

        encrypt_string = ordered_string + "560c52ccd288fed045859ed18bffd9773"
        obj = hashlib.md5(encrypt_string.encode("utf-8"))
        sign = obj.hexdigest()
        return jsonify({"status": True, "data": sign,"version": "v5"})
    except:
        return jsonify({"status": False, "data": "未知错误"})


if __name__ == "__main__":
    app.run()
